package com.woniu.secondhand.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.woniu.secondhand.entity.dto.AfterOrderUpdateDTO;
import com.woniu.secondhand.entity.dto.BeforeOrderUpdateDTO;
import com.woniu.secondhand.pojo.SecondhandOrder;
import com.woniu.user.vo.UserLoginVO;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author HMMT
 * @since 2023-05-20
 */
public interface ISecondhandOrderService extends IService<SecondhandOrder> {

    /**
     * 用户可以创建购买商品的订单。
     *
     * @param productId
     * @param addressId
     * @param userLoginVO
     * @return
     */
    SecondhandOrder createOrder(Integer productId, Integer addressId, UserLoginVO userLoginVO);

    /**
     * 根据订单号获取订单对象
     *
     * @param orderNo
     * @return
     */
    SecondhandOrder getByOrderNo(String orderNo);

    /**
     * 根据产品id获取订单对象 这个订单对象一定会是收货成功的状态
     *
     * @param productId
     * @return
     */
    SecondhandOrder getByProductIdAndStatusEqualsReceiveSuccess(Integer productId);

    /**
     * 用户可以通过系统进行订单支付操作。
     *
     * @param order
     */
    void pay(SecondhandOrder order);

    /**
     * 用户可以在订单支付前修改订单信息。
     *
     * @param orderUpdateDTO
     * @return
     */
    SecondhandOrder updateOrderBeforePay(BeforeOrderUpdateDTO orderUpdateDTO);

    /**
     * 用户可以在订单支付后修改订单信息。
     * 主要提供添加物流信息的功能，同时采用了死信队列技术，确保在订单完成后的15天内自动确认收货，并发送相应的消息通知。
     *
     * @param orderUpdateDTO
     * @param userLoginVO
     * @return
     */
    SecondhandOrder updateOrderAfterPay(AfterOrderUpdateDTO orderUpdateDTO, UserLoginVO userLoginVO);

    /**
     * 用户可以主动关闭未完成的订单。
     *
     * @param orderId
     * @param userLoginVO
     */
    void closeOrder(Integer orderId, UserLoginVO userLoginVO);

    /**
     * 确认收货流程
     *
     * @param userLoginVO
     * @param orderId
     * @return
     */
    SecondhandOrder updateOrderConfirm(UserLoginVO userLoginVO, Integer orderId);

    /**
     * 退款流程
     *
     * @param userLoginVO
     * @param orderId
     * @return
     */
    SecondhandOrder updateOrderRefund(UserLoginVO userLoginVO, Integer orderId);
}
